home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Bavarian / Bavarian #122 (19xx)(APS Electronic).zip / Bavarian #122 (19xx)(APS Electronic).adf / pascal.dok < prev    next >
Text File  |  1988-08-04  |  57KB  |  1,311 lines

  1.  
  2.  
  3.                         PCQ Version 1.0c
  4.             Ein sehr einfacher Pascal Compiler für den Amiga
  5.                         von Patrick Quaid
  6.  
  7.     PCQ (das steht für Pascal Compiler, Q, tja..., Patrick hat hier einfach
  8.     seine Initialien genommen, da er sich keinen Namen ausdenken konnte)
  9.     ist ein Subset Compiler, der Assembler Code erzeugt. Er ist nicht
  10.     Public Domain (Patrick behält sich das Copyright für den Sourcecode,
  11.     den Compiler, den Runtime-Library Sourcecode, die Runtime-Library und
  12.     diese Dokumentation vor), kann aber frei verteilt werden, solange alle
  13.     Dateien des Archive unverändert beigelegt sind (mit Ausnahme des
  14.     Assemblers und des Linkers). Der Compiler ist langsam (meint Patrick)
  15.     und beherrscht einige Dinge nicht, aber alles in allem ist er seinen
  16.     Preis wert. Zusammenfassend:
  17.  
  18.     Das Schlechte:
  19.  
  20.  
  21.         Der Compiler ist sehr langsam.
  22.         Er erlaubt keine Bereichstypen.
  23.         Es unterstützt 'With' und 'Set' nicht.
  24.         Der Code ist noch nicht optimiert. Er ist deshalb langsam,
  25.          fett und sieht allgemein recht dumm aus.
  26.         Der Compiler verkraftet die meisten Fehler nicht besonders gut.
  27.  
  28.     Das Gute:
  29.  
  30.         Er arbeitet zum größtem Teil.
  31.         Der Compiler unterstützt Include-Dateien.
  32.         Er erlaubt externe Referencen, obwohl sie diese selber überprüfen
  33.           müssen (dies ist schließlich nicht Modula-2).
  34.         Er unterstützt Records, Zähltypen, Zeiger, Arrays und Strings.
  35.         Typen Konvertierungs, wie es sie in Modula-2 (und in Turbo Pascal
  36.           ab 4.0, A.d.Ü) gibt, wird ebenfalls unterstützt. Anders ausgedrückt
  37.           ist eine Anweisung wie "integer('d')" legal.
  38.         Sie können so viele const, var, type procedure und function Blöcke
  39.           haben, wie siemöchten.
  40.         Er ist kostenlos!
  41.  
  42.  
  43.                         
  44. [4mInhaltsverzeichnis
  45. [0m
  46.  
  47.     Dieses Manual ist dafür angelegt, mit einem Dateianzeiger (z.B. MuchMore)
  48.     oder einem Texteditor gelesen zu werden, so daß das Inhaltsverzeichnis
  49.     statt Seiten- Zeilennummern als Verweise benutzt.
  50.  
  51.     Kapitel                                            Zeilennummer
  52.  
  53.     Wie wird PCQ benutzt? ................................  129
  54.  
  55.     Eine Erklärung von PCQs Fehlern ......................  175
  56.  
  57.     Vordefiniertes .......................................  255
  58.  
  59.         Konstanten .......................................
  60.         Typen ............................................
  61.         Variablen ........................................
  62.         Funktionen .......................................
  63.         Prozeduren .......................................
  64.         Extra Statements .................................
  65.         Die extra Libraries ..............................
  66.  
  67.     Reservierte Wörter ...................................
  68.  
  69.     Fließkomma Mathematik ................................
  70.  
  71.     Die Grenzen von PCQ ..................................
  72.  
  73.     Strings ..............................................
  74.  
  75.     Compiler Direktiven ..................................
  76.  
  77.     Typen Konvertierung ..................................
  78.  
  79.     Externe Verweisen ....................................
  80.  
  81.     Eingabe/Ausgabe ......................................
  82.  
  83.     Fehler ...............................................
  84.  
  85.     Laufzeitfehler .......................................
  86.  
  87.     Quelltexte ...........................................
  88.  
  89.     Bemerkungen für Assembler Programmierer ..............
  90.  
  91.     Geplante Erweiterungen ...............................
  92.  
  93.     Update History .......................................
  94.  
  95.     Weitere Bemerkungen, Copyright & Patricks Addresse ...
  96.  
  97.  
  98.  
  99.  
  100.                          
  101. [4mWie wird PCQ benutzt?
  102. [0m
  103.  
  104.  
  105.     Es gibt verschiedene Dateien in diesem Archive (auf der PCQ Diskette,
  106.     A.d.Ü), die sie auf ihre Arbeitsdiskette kopieren müssen. Der Compiler
  107.     (Pascal) ist natürlich eine davon, ebenso wie die Runtime-Library
  108.     (genannt PCQ.Lib - es gibt übrigens eine Readme Datei auf der Diskette,
  109.     die alle Dateinamen erklärt; wenn nicht haben sie eine illegale Kopie
  110.     und sollten dies Patrick Quaid mitteilen). Wenn sie den Assembler (A68k)
  111.     und den Linker (Blink) nicht haben, müssen sie diese auch kopieren
  112.     (sie könnten allerdings nicht auf der Diskette sein, sind aber über
  113.     Mailbox oder über PD (Fish) leicht erhältlich). Diese Dateien sind
  114.     für die einfachsten Compilationen nötig.
  115.  
  116.     Die Dateien mit der Endung ".p" sind Beispielpascalprogramme, die
  117.     sie, wenn sie möchten, mitkopieren können. Patrick verbrachte
  118.     wesentlich mehr Zeit mit dem Compiler, als mit den Beispielen,
  119.     einige sind allerdings interessant, wenn man solche Programme vorher
  120.     noch nicht gesehen hat. Sie demonstrieren jede Seite des Compilers,
  121.     die Patrick sich vorstellen kann, so daß man sie sich ansehen sollte.
  122.     Wenn sie den Quelltext mit dem Compiler erhalten haben, so gibt es
  123.     eine Reihe weiterer Dateien mit der Endung ".p".
  124.  
  125.     Die Dateien, die auf ".i" enden, sind Amiga Include Dateien, für
  126.     einige der System Libraries. Sie definieren Records, Typen, Konstanten,
  127.     Proceduren, Funktionen und Variablen, die man benötigt, um mit dem
  128.     System zu arbeiten. Diese sollte man sich ebenfalls irgendwohin
  129.     kopieren. Des weiteren gibt es eine Include Datei für einige String
  130.     Routinen (sie sind C ähnlich, A.d.Ü). Der Code dieser Routinen ist
  131.     in der Runtime-Library.
  132.  
  133.     Wenn sie ein Programm compilieren wollen, müssen sie es erst mit einem
  134.     ASCII Texteditor ihrer Wahl (z.B. Dme) schreiben, oder sie benutzen
  135.     eines der Beispielprogramme. Dann tippen sie ein:
  136.  
  137.         1> Pascal prog.p prog.asm
  138.  
  139.     "1>" ist das CLI Prompt.
  140.     "Pascal" ist der Name des Compilers, den sie, wenn sie möchten beliebig
  141.     ändern können. "Prop.p" ist der Pascal-Quelltext, den sie ebenfalls
  142.     nennen können, wie sie möchten. Das letzte Wort ist der Name der
  143.     Assembler Datei, die erzeugt wird. Zur Zeit sind nur Kommandozeilen-
  144.     Optionen erlaubt. Die Beispielprogramme erwarten übrigens, daß die
  145.     Include Dateien sich in einem Verzeichnis namens "Include" befinden,
  146.     das ein Unterverzeichnis des aktuellen Verzeichnisses ist (anders
  147.     gesagt, versuchen die Programme z.B. nicht "exec.i", sondern
  148.     "Include/exec.i" einzubinden). Wenn sie hiermit Probleme bekommen,
  149.     müssen sie nur die Inlude-Anweisungen am Anfang der Programme ändern.
  150.     Wenn die Compilation ohne Fehler endet, müssen sie folgendes eingeben:
  151.  
  152.         1> A68k prog.asm prog.o
  153.  
  154.     Das veranlaßt den Assembler Objetk-Code zu erzeugen. Wenn die Diskette
  155.     A68k enthält, so befindet sich höchst wahrscheinlich auch dessen
  156.     Dokumentation (A68k.Doc) darauf, so daß sie diese für Informationen
  157.     über den Assembler konsultieren müssen. Wenn der Assembler nicht
  158.     beigefügt war, versuchen sie sie A68k Version 2.41 von Charlie Gibbs
  159.     zu benutzen. A68k macht viele kleine Verbesserungen bei der
  160.     Übersetzung und es könnte sein, daß PCQ diese benötigt, so daß Patrick
  161.     nicht garantieren kann, daß PCQ mit einem anderem Assembler
  162.     zusammenarbeitet. Schließlich müssen sie das Programm noch linken.
  163.     Geben sie Folgendes ein:
  164.  
  165.         1> Blink prog.o small.lib to prog library PCQ.lib
  166.  
  167.     Das erzeugt ein lauffähiges Programm namens "Prog".
  168.     Alle Pascal Laufzeitroutinen, die Amiga Systemroutinen und Patricks
  169.     kleines String-Library sind in PCQ.lib enthalten. Wenn eine der
  170.     Routinen ebenso heißt, wie die, die sie benutzen möchten, müssen
  171.     sie sie ihre Library oder ihre Objektdatei in der Kommandozeile vor
  172.     PCQ.lib schreiben. Wenn Blink sich auf der Diskette befindet, so
  173.     befindet sich dessen Dokumentation sicherlich ebenfalls darauf,
  174.     so daß sie diese für Antworten auf irgendwelche Fragen lesen müßten.
  175.     Patrick benutzt Blink Version 6.7 und auch hier weiß Patrick nicht,
  176.     ob PCQ mit einem anderem Linker oder anderen Version arbeiten würde.
  177.     Small.lib ist eine Library mit Systemaddressen von Matt Dillon.
  178.     Aufgrund eines Fehlers in Blink muß sie als Objektdatei eingebunden
  179.     werden und nicht als Library, wo es hingehören würde. Es erhöht die
  180.     Größe des Programmes nicht.
  181.  
  182.     Anstelle von den obigen Anweisungen können sie auch die beigefügte
  183.     "make" Batchdatei benutzen. Sie müssen es vielleicht an ihre
  184.     Verzeichnissstruktur anpassen und anschließend wird es durch die
  185.     Fähigkeiten von AmigaDOS 1.3 (oder durch die wesentlich besseren
  186.     von ARP 1.3, von der TBAG 31, zu dem sie von der AIT oder von mit
  187.     auch eine ausführliche deutsche Anleitung bekommen können)
  188.     mittels "Protect make +s" als ausführbare Batchdatei deklariert und
  189.     sie müssen nur noch Folgendes eingeben, um einen (fehlerfreien)
  190.     Quelltext in ein ausführbares Programm umzuwandeln:
  191.  
  192.         1> make prog
  193.  
  194.     Diese Anweisung nimmt die Datei 'prog.p' und erzeigt die Datei 'prog'.
  195.     Wenn ihr Programm separat kompilierte Units (Module, Objektdateien)
  196.     hat, müssen sie die Batchdatei modifizieren, z.B. den Linkeraufruf
  197.     hinausnehmen und von Hand eingeben. Patrick rät, für jedes Programm,
  198.     daß mehrere Male compiliert werden muß, eine Batchdatei zu schreiben.
  199.     Wenn sie damit nicht klarkommen können sie an Patrick schreiben
  200.     oder ihn anrufen (sie können natürlich auch an micht schreiben oder
  201.     anrufen, A.d.Ü).
  202.  
  203.  
  204.  
  205.                    
  206. [4mEine Erklärung von PCQs Fehlern
  207. [0m
  208.  
  209.     Wie oben schon gesagt, arbeiten Sets (set of) und die With Anweisung
  210.     nicht. Des weiteren wird folgende Syntax nicht akzeptiert:
  211.  
  212.         type
  213.           smallnumber = 1..20;
  214.  
  215.     PCQ prüft nicht auf während der Laufzeit eine Menge überläuft, so daß
  216.     die obige Anweiung z.Z. nicht viel bedeuten würde. Die Ausnahme hiervon
  217.     sind Arrays, wo eine Bereichsprüfung erfolgt (Näheres siehe unten).
  218.     Etwas das auch nicht funktioniert ist Folgendes:
  219.  
  220.         type
  221.           WindowPtr = ^Window;
  222.           Window = record
  223.             NextWindow : WindowPtr;
  224.             ...
  225.           end;
  226.  
  227.     Diese Programm würde in der 2. Zeile mit einem 'Unknown ID' Fehler
  228.     abbrechen. Statt dessen müßten sie etwas, das etwa so aussieht,
  229.     einsetzen:
  230.  
  231.         type
  232.           Window = record
  233.             NextWindow : ^Window;
  234.             ...
  235.           end;
  236.           WindowPtr = ^Window;
  237.  
  238.     Das ist etwas, das Patrick berichtigen sollte, aber es ist nicht
  239.     umbedingt notwendig, so daß ...
  240.     (Bei Turbo Pascal würde eine Zuweisung von Window.NextWindow und einer
  241.     Variablen des Types WindowPtr einen Typen-Fehler hervorrufen und es
  242.     müßte eine Typenumwandlung WindowPtr(Window.NextWindow) erfolgen, A.d.Ü).
  243.  
  244.     Des weiteren benötigt und erlaubt PCQ keine Parameter in der
  245.     Programm Kopfzeile. Anders gesagt wäre
  246.  
  247.         Program Texter(input, output);
  248.  
  249.     ...nicht erlaubt (dies ist bei den meisten Pascal Compilern so, A.d.Ü).
  250.     Sie müssen die Paramter einfach weglassen (Programm Tester;).
  251.     Eine weitere Fähigkeit von Standard Pascal, die Patrick nicht umbedingt
  252.     einbinden wollte, ist das "goto" Statement. Obwohl sowohl "label", als
  253.     auch "goto" reservierte Worte sind, hat Patrick sie noch nicht zu einem
  254.     Teil der Sprache gemacht.
  255.  
  256.     Der Compiler erlaubt bisher keine varianten Records. Das wird bald
  257.     behoben sein, wahrscheinlich in der nächsten Version des Compilers.
  258.     In Arraykonstanten, die Zeichen sind, akzeptiert PCQ nicht die zwei
  259.     Hochkommas hintereinander (''), die ein Hochkomma in der Konstanten
  260.     darstellen. Stattdessen gibt es einen anderen Type, wozu ich noch
  261.     weiter unter komme.
  262.  
  263.     Zum Schluß kommen wir zu verschachtelten Prozeduren. Aufgrund von
  264.     zwei Problemen hat Patrick vor längerer Zeit entschieden, sie
  265.     wegzulassen, obwohl er einen großteils des Compilers mit der
  266.     Absicht geschrieben hat.
  267.     Das erste Problem ist das der Namen. Wenn man verschachtelte Prozeduren
  268.     in Pascal benutzt, ist es möglich, zwei Prozeduren mit dem selbem
  269.     Namen zu haben, die aber in einem unterschiedlichem Level sind.
  270.     Das funktioniert mit dem Compiler sehr gut, aber leider hat ein
  271.     Assembler nur einen Level. So müßte man verschiedene Namen für die
  272.     Prozeduren und Funktionen erzeugen und jeweils die richtige ansprechen.
  273.  
  274.     Das andere Problem ist wesentlich komplexer: aus einer verschachtelten
  275.     Prozedur kann man die lokalen Variablen der übergeordneten Prozedur
  276.     ansprechen, sowie die eigenen lokalen Variablen, die Parameter und
  277.     die globalen Variablen des Programmes. Auch hier ist es kein Problem
  278.     des Compilers, aber wenn man ein Programm startet, läuft es nicht
  279.     korrekt. Patrick hat den Fehler zwar gefunden, da dessen Behebung mit
  280.     Testen aber ziemlich lange dauern würde, hat er diese Version ohne
  281.     verschachtelte Prozeduren herausgegeben.
  282.  
  283.  
  284.  
  285.                      
  286. [4mVordefiniertes
  287. [0m
  288.  
  289.     Der Deklarationsteil sieht genauso aus wie in Standard Pascal.
  290.     In PCQ kann man jedoch alles beliebig anordnen, und jeden Teil
  291.     mehrfach auftreten lassen. Ein Programm könnte z.B. so ausseheh:
  292.  
  293.         Program name:
  294.  
  295.         var
  296.             Variablendeklarationen
  297.         type
  298.             Typen
  299.         var
  300.             weitere Variablen
  301.         procedure
  302.             eine Prozedur
  303.         var
  304.             noch mehr Variablen...
  305.  
  306.     ...und so weiter. Trotzdem muß ein Identifier immer noch deklariert
  307.     werden, bevor er benutzt werden kann. Patrick erlaubte dies, da es
  308.     ziemlich viel arbei ist verschiedene Include Dateien zu deklarieren
  309.     (jede der System Inlcude Dateien würde in vie Sektionen unterteilt
  310.     werden müssen: die Konstanten, die Typen, die Variablen und die
  311.     Prozedure und Funktionen).
  312.  
  313.     CONST
  314.  
  315.         True und False sind als -1 und 0 definiert.
  316.  
  317.         Nil ist als ein Zeiger mit dem konstantem Wert Null deklariert,
  318.             es ist aber kein reserviertes Wort, wie in Standard Pascal
  319.  
  320.         An den meisten Stellen, die eine Konstante erwarten, ist
  321.         eine Konstanten Berechnung erlaubt, die während des Compilierens
  322.         berechnet werden kann (ähnlcih wie in Turbo Pascal 5.0, A.d.Ü).
  323.         Das folgende wäre z.B. eine korrekte Anweisung:
  324.  
  325.         const
  326.           first = 234;
  327.           second = first * 2;
  328.  
  329.         type
  330.             thetype = array [first .. first + 7] of char;
  331.  
  332.         Man kann aber Standart Funktionen, Typenumwandlung,
  333.         Fließkommazahlen, oder andere Dinge, die man mit Konstanten machen
  334.         kann, nicht benutzen. Nur die 5 mathematischen Basicfunktionen
  335.         (+, -, *, div, mod) sind bis jetzt möglich. Beachten sie auch,
  336.         daß 'first + 7' während des Compilierens berechnet würde, der
  337.         selbe Text im Programm aber erst während der Laufzeit (kein
  338.         optimierender Linker/Compiler).
  339.         Wenn sie Integer Konstanten benutzen, können sie die Stellen mit
  340.         einem Unterstrich voneinnander trennen, ählich wie in Ada, z.B.:
  341.  
  342.             const
  343.               Tausend    = 1_000;
  344.               Zehntausen = 1_0_0_0_0;
  345.  
  346.  
  347.         MaxInt ist als $7FFFFFFF (268435355) definiert.
  348.  
  349.         MaxShort ist 32767, oder $7FFF.
  350.  
  351.  
  352.     TYPE
  353.  
  354.         Es gibt verschiedene vordefinierte Typen, diese beinhalteten
  355.         Folgende:
  356.  
  357.         Integer     4 Bytes, die Länge ist plus oder minus MaxInt
  358.  
  359.         Short       2 Bytes. Buchstaben werden solange als Short
  360.                     Werte angesehen, bis sie einen größeren Wert als
  361.                     32767 oder einen kleineren als -32767 annehmen.
  362.  
  363.         Byte        1 Byte. Diese drei Typen sind alle numerischen Typen,
  364.                     so daß man sie in normalen Zuweisungen benutzen kann,
  365.                     ohne daß man sich um Konversionen sorgen machen muß.
  366.                     Der Compiler konvertiert Small Werte automatisch in
  367.                     die benötigte Größe. Beachten sie, daß es zur Zeit
  368.                     keine Überlaufsprüfung gibt.
  369.  
  370.         Real        4 Bytes. Diese Zahlen sind im FFP Format (Fließkomma).
  371.  
  372.         Char        1 Byte.
  373.  
  374.         Boolean     1 Byte. False ist 0 und True ist -1
  375.  
  376.         String      4 Bytes. Strings sind nur als ^char definiert.(s.u.)
  377.  
  378.         Address     4 Bytes. Das ist ein Zeiger auf keinen bestimmten Type,
  379.                     der Typenkompatibel mit jedem anderem Typen ist -
  380.                     die Konstante NIL ist vom Type Address (der Type Address
  381.                     entspricht dem Typen Pointer bei Turbo Pascal, A.d.Ü)
  382.  
  383.         Text        18 Bytes. Dies ist nicht dasselbe wie ein 'file of char'
  384.                     Type. Standard Input und Output sind Text Dateien.
  385.                     Sie können Integer, Character, Arrays von Charactern und
  386.                     Strings in Textdateien schreiben und lesen.
  387.                     Des weiteren können sie Boolean Werte schreiben.
  388.  
  389.         Enumerated  2 Bytes.
  390.  
  391.  
  392.         Wie oben angegeben, können sie arrays, pointer, records und files,
  393.         die auf diesen Typen basieren, benutzen. Sie können auch synonyme
  394.         Typen (wie 'type int = integer') benutzen, aber sie sind nicht
  395.         sehr konsistent.
  396.         Beachten sie auch, daß sie überall, wo sie einen Type benötigen,
  397.         auch eine volle Typenbescheibung einsetzen können.
  398.         Eine Compiler haben hiermit Probleme und Patrick ist sich nicht
  399.         sichern, was Standard Pascal hierfür vorschreibt, aber es
  400.         interessiert ihn auch nicht sehr.
  401.  
  402.  
  403.     VAR
  404.  
  405.         Die einzige standard Variable in PCQ ist:
  406.  
  407.             CommandLine : array [1..128] of char;
  408.  
  409.         Wie der Name angibt, enthält die Variable die CLI Kommandozeile,
  410.         mit der das Programm aufgerufen wurde. Sie ist eine Kopie davon,
  411.         so daß sie sie nach Eigenbedarf verändern können. Die signifikanten
  412.         Zeichen werden von einem Null Byte abgeschlossen, wonach jeder
  413.         raten kann, was die Variable enthält. Wenn sie dieses Array nicht
  414.         mehr benötigen, können sie es beliebig einsetzen. Es ist vorhanden,
  415.         d.h. nimmt Speicherplatz weg, so dß sie es genausogut verplanen
  416.         können.
  417.  
  418.  
  419.     FUNCTION
  420.  
  421.         Die Standart Funktionen, die keinen weiteren transzendenten
  422.         Funktionen benötigen, werden unterstütuzt. Dies sind:
  423.  
  424.             function ord ( x : jeder ordinale Type) : intger;
  425.  
  426.               (* gibt den ordinalen Wert eines Argumentes zurück *)
  427.  
  428.             function chr ( x : numerischer Type) : char;
  429.  
  430.               (*gibt ein Zeichen zurück, dessen ASCII Wert eingegeben wurde*)
  431.  
  432.             function abs ( x : real, integer, short oder byte) : dasselbe;
  433.  
  434.               (* gibt den absoluten Wert (ohne Vorzeichen) zurück *)
  435.  
  436.             function succ ( x : ordinaler Type) : dasselbe;
  437.  
  438.               (* gibt x + 1 mit demselbem Type zurück *)
  439.  
  440.             function pred ( x : ordinaler Type) : dasselbe;
  441.  
  442.               (* gibt x - 1 mit demselbem Type zurück *)
  443.  
  444.             function odd ( x : numerischer Type) : boolean;
  445.  
  446.               (* gibt True zurück, wenn der übergebene Wert ungerade ist *)
  447.  
  448.             function trunc ( x : real) : integer;
  449.  
  450.               (* gibt den Integer Teil eines Real Wertes zurück *)
  451.  
  452.             function float ( x : integer, short oder byte) : real;
  453.  
  454.               (* konvertiert diese Tyoen in FFP Format *)
  455.  
  456.             function floor ( x : real) : real;
  457.  
  458.               (* gibt den größten Integer Wert, kleiner als X zurück *)
  459.  
  460.             function ceil ( x . real) : real;
  461.  
  462.               (* git den letzten Integer Wert, größer als x zurück *)
  463.  
  464.             function eof ( x : irgend ein file Type) : boolean;
  465.  
  466.               (* gibt True zurück, wenn sie sich am Ende der Datei befinden*)
  467.  
  468.             function adr ( var x : irgendeine Variable) : Address;
  469.  
  470.               (* gibt die Addresse von X zurück *)
  471.  
  472.             function SizeOf ( t : Name eines Types) : Integer;
  473.  
  474.               (* gibt die Größe eines Types zurück *)
  475.  
  476.             function Bit ( t : integer) : Integer;
  477.  
  478.               (* gibt einen Integer Wert, mit dem angegebenen Bit gesetzt
  479.                  zurück *)
  480.  
  481.         Außer den FFP Sachen, werden alle Routinen bis zu diesem Punkt
  482.         auf die selbe Art und Weise behandelt. Die anderen zwei Standard
  483.         Funktionen sind für das öffnen von Dateien. Sie werden vollständig
  484.         erklärt, wenn auf die Ein-/Ausgabe eingegangen wird. Es gibt
  485.         auch eine Syntax 'typename (expression)', die von der Sprache
  486.         unterstützt wird. Es sieht aus wie eine Funktion, ist aber keine
  487.         und wird in dem Kapitel über Typenumwandlung erklärt.
  488.  
  489.  
  490.     PROCEDURE
  491.  
  492.         Die Standard Proceduren sind write, writeln, read, readln, get,
  493.         new dispose, exit und trap. Die ersten fünf werden in dem
  494.         Ein-/Ausgabe Teil behandelt. Die anderen vier sind:
  495.  
  496.         procedure new ( var x : any pointer variable );
  497.  
  498.             Diese Funktion reserviert Speicher, mit der Größe des Types, auf
  499.             den der Zeiger zeigt und übergibt die Addresse an x. PCQ belegt
  500.             Speicher, indem es Intuitions AllocRemember() Routinen benutzt,
  501.             so daß am Ende des Programmes der Speicher, der mittels new()
  502.             belegt wurde, wieder freigegeben wird. Das bedeutet, daß sie
  503.             dispose() nicht unbedingt aufrufen müssen, obwohl sie es sollten.
  504.             Übrigens bricht das Programm ab, wenn die Belegung nicht
  505.             erfolgreich war. Patrick will das eventuell beheben, aber in
  506.             der Zwischenzeit können sie mittels Exec Speicher belegen und
  507.             die Fehler behandeln, wenn sie es benötigen.
  508.  
  509.         procedure dispose ( var x : pointer variable );
  510.  
  511.             Diese Prozedur gibt belegten Speicher wieder an das System
  512.             zurück. Wenn etwas schiefläuft und sie Speicher freigeben wollen,
  513.             den sie nie belegt haben, bricht nur die Prozedur, nicht aber
  514.             das Programm ab. Das heißt zwar, daß sie vielleicht ein Problem
  515.             in ihrem Programm nie bemerken, aber andererseits wird nicht
  516.             jedesmal ein GURU hervorgerufen.
  517.  
  518.         procedure exit ( error : integer );
  519.  
  520.             Exit() bricht ein Programm ab. Das ist eine akzetable Methode,
  521.             ein Programm zu beenden. Es führt dasselbe aus, das ein Programm
  522.             normalerweise bei Beendigung macht und gibt die Fehlernummer,
  523.             die sie übergeben, an AmigaDOS. Diese Routinen gibt allen
  524.             Belegten Speicher wieder frei und schließt alle Dateien.
  525.             Da es die Konventionen erfordern, sollten sie 0 übergeben,
  526.             wenn das Programm korekt beendet wurde, 5 für eine Warnung,
  527.             10 für einen Fehler und 20 für einen katastrophalen Fehler.
  528.  
  529.         procedure trap ( num : integer );
  530.  
  531.             Der Parameter für diese Funktion muß eine Konstante sein,
  532.             obwohl der Type egal ist. Alles was es macht, ist einen
  533.             68000 Trap Instruktion in den Code einzufügen. Das ist
  534.             nützlich für den Debugger, den Patrick benutzt und für
  535.             nichts anderes, das er sich vorstellen kann.
  536.  
  537.  
  538.     Extra Statements
  539.  
  540.         Erstens unterstützt PCQ if, while, repeat, for und case Anweisungen.
  541.         With wird noch nicht unterstützt, aber es wird bald implementiert
  542.         werden.
  543.         Die if, while und repeat Anweisungen arbeiten so, wie sie es sollen.
  544.         Die Case Anweisung ist nun wesentlich mehr wie das normale Pascal
  545.         Case als in Version 1.0. Jeder Fall kann nun jede Anzahl von
  546.         Konstanten oder Konstantenbereichen haben. Am Ende von Case können
  547.         sie ein ELSE Statement angeben, das ausgeführt wird, falls keiner
  548.         der anderen Fälle zutraf. Hier sind einige Case Beispiele:
  549.  
  550.             case Letter of                  case Number * 5 of
  551.               'a'      : statement1;          -MaxInt..0 : statement1;
  552.               'b'..'g' : statement2;           1..MaxInt : statement2;
  553.               'j',                          end;
  554.               'm'..'o',
  555.               'h'      : statement3;
  556.               else statement4;
  557.             end;
  558.  
  559.         Die for Anweisung unterstützt 'downto', das die Steigerung von
  560.         1 zu -1 ändert. Es unterstützt außerdem 'by', mit dem man die
  561.         Steigerung setzen kann. Das Argument für 'by' kann jeder reguläre
  562.         Ausdruck sein, aber für jede negative Steigerung müssen sie 'downto'
  563.         anstelle von 'to' benutzen oder die Schleife wird nur einmal
  564.         ausgeführt. Alle 'for' Schleifen laufen mindestens einmal durch.
  565.         Die Syntax für 'for' sihet ungefähr so aus:
  566.  
  567.             for <Variable> := <Ausdruck> to|downto <Ausdruck>
  568.                               [by <Ausdruck>] do <Statement>;
  569.  
  570.         Das andere Statement, ds unterstützt wird ist 'return', das einfach
  571.         eine Funktion abbricht. Sie können eine Funktion abbrechen, indem
  572.         sie ihrem Namen einen Wert zuweisen (Achtung!! - Dies ist in
  573.         Turbo Pascal und anderen Dialekten anders ! A.d.Ü.).
  574.  
  575.  
  576.         Die extra Libraries
  577.  
  578.         Es sollten einige extra Libraries mit auf der Diskette sein, deren
  579.         Code in PCQ.lib ist, deren Beschreibungen aber extra sind.
  580.         Die meisten dieser Libraries sind Schnittstellen zum Sytem und
  581.         alle sind individuell in ihren .i Dateien dokumentiert.
  582.         Beachten sie, daß sie, um AmigaDOS, Exec und Intuition Funktionen zu
  583.         benutzen, nicht die Libraries öffnen müssen. Alle diese Libraries
  584.         werden automatisch vom Startup-Code geöffnent und werden tatsächlich
  585.         von allen PCQ Programmen benötigt.
  586.  
  587.  
  588.  
  589.                         
  590. [4mReservierte Wörter
  591. [0m
  592.  
  593.  
  594.     Die reservierten Wörter von PCQ sind:
  595.  
  596.             and         for         procedure
  597.             array       forward     program
  598.             begin       function    record
  599.             by          goto        repeat
  600.             case        if          return
  601.             const       in          set
  602.             div         label       then
  603.             do          mod         to
  604.             downto      not         type
  605.             else        of          until
  606.             end         or          var
  607.             external    packed      while
  608.             file        private     with
  609.  
  610.     Wie sie sehen, sind sogar die nicht implementierten Dinge reserviert.
  611.     Das einzige, daß nicht in diesem Text erklärt ist, ist "private",
  612.     das bei externen Referencen und mehr Flexibiltät in Zukunft helfen soll.
  613.  
  614.  
  615.  
  616.                         
  617. [4mFließkomma Mathematik
  618. [0m
  619.  
  620.     Von Version 1.0c an sind REAL Zahlen in der Sprachen enthalten.
  621.     Im Programmtext können sie mittels der der normalen Definition (ABC.DEF)
  622.     spezifiert werden. Die wissenschaftliche Syntaxt, z.B. 1.0876E-4, wird
  623.     NICHT unterstützt. Die einzigen mathematischen Operanden, die unterstützt
  624.     werden, sind +, -, / und *. Der Rest der MathFFP.library ist ebenfalls
  625.     ansprechbar. Die Standard Funktionen für Real Zahlen sind Abs(), floor(),
  626.     ceil(), trunc() und float().
  627.     Funktionen wie sin(), cos() und sqrt() werden nicht von der
  628.     MathFFP.library unterstützt. Sie sind in der MathTrans.library enthalten,
  629.     die sich auf der Diskette befindet. Daher müssen jedesmal, wenn sie
  630.     ein Programm schreiben, daß diese Funktionen verwendet, die
  631.     Systemdiskette eingelegt werden, um an das LIBS: Verzeichnis zu kommen.
  632.     In MathTrains.i erhalten sie mehr Informationen hierrüber. Patrick hat
  633.     keine Pläne, dieses Funktionen zu implementieren. Auf absehbare Zeit
  634.     werden sie die MathTrans.library jedesmal für trigonometrische und
  635.     exponentiale Funktionen benötigen.
  636.  
  637.  
  638.  
  639.                         
  640. [4mDie Grenzen von PCQ
  641. [0m
  642.  
  643.     Der Compiler akzeptiert Zeilen von jeder Länge, obwohl er bei Fehlern
  644.     nur die ersten 128 Zeichen ausgibt. Eine Datei kann bis auf einige
  645.     Einschränkungen ebenfalls beliebig groß werden (der Compiler hat
  646.     immer nur das akutelle Zeichen im Speicher).
  647.     Die erste ist, daß es nur eine begrenzte Anzahl von Identifiern gibt,
  648.     da der Compiler sie immer noch in einem großem Array speichert.
  649.     Darüber brauche sie sich allerdings keine Sorgen zu machen, da alle
  650.     Include Dateiene zusammen gerade einmal ein Drittel des Platzes
  651.     einnehmen. Dies wird in der nächsten Version behoben werden.
  652.     Es gibt nocht andere Limits, aber Patrick kam niemals auch nur nahe daran
  653.     heran, als er den Compiler kompilierte, so daß er sich nicht vorstellen
  654.     kann, daß sie sie sie erreichen könnten.
  655.     Die zweite Einschränkung ist, daß genug Platz auf der Diskette sein muß,
  656.     da der Compiler eine sehr lange Assembler Datei erzeugt.
  657.     Der Assembler Code ist normalerweise mehr als fünf mal länger, als der
  658.     Pascal Code.
  659.     Der Compiler braucht während er läuft mit Stack ca. 220K Speicher.
  660.  
  661.  
  662.  
  663.                         
  664. [4mStrings
  665. [0m
  666.  
  667.     Wie oben angegeben, müssen Strings als '^char' behandelt wreden. Sie
  668.     sind so definiert, werden aber auch auch spezielle behandelt. Sie können
  669.     dynamisch erstellt, in der Größe verändert und wieder entfernt werden.
  670.     Ein String wird mit einem Null Byte am Ende erwartet, was sie beachten
  671.     sollten, falls sie eigene String Routinen schreiben, da es sonst Probleme
  672.     mit den anderen String Routinen gibt. Im Programmtext, umgeben sie
  673.     String mit Anführungszeichen, anstelle der Hochkommas, die normalerweise
  674.     in Arrays of Char verwendet werden.
  675.  
  676.         "A string"  ; ist ein String, während
  677.         'not one'   ; als array[1...8] of char angesehen wird.
  678.  
  679.     Eine weitere interessante Fähigkeit von String ist, daß sie mit C
  680.     ähnlichen Escape-Sequenzen ausgestattet werden können. Nach einem
  681.     Backslash (\) können sie spezielle Zeichen eingeben. C hat davon sehr
  682.     viele, aber Patrick hat bisher nur die, die er benutzt, eingefügt:
  683.  
  684.         \n  steht für einen Zeilenvorschub oder chr(10)
  685.         \t  steht für einen Tabulator oder chr(9)
  686.  
  687.     Alle andere wird ungeändert ausgegeben, so daß man hiermit auch
  688.     Anführungszeichen in String einfügen kann. Des weiteren muß man es
  689.     benutzen, um einen Backslash einzufügen.
  690.  
  691.         "A\tboy\nand\\his \"dog.\"" ; ergibt:
  692.  
  693.         A       boy
  694.         and\his "dog."
  695.  
  696.     Auf der Diskette befindet sich eine Include Datei namens StringLib.i,
  697.     die einige String Routinen deklariert - es sind die, die Patrick für den
  698.     Compiler benötigte. Lesen sie die Datei für mehr Informationen. Wenn
  699.     sie nicht mit den Strings klarkommen, müssen sie nur daran denken, daß
  700.     sie den C Strings sehr ähnlich sind und in dem meisten Situationen
  701.     benutzt werden können. Beachten sie, daß sie bei der Deklaration von
  702.     Strings keinen Platz für Zeichen bekommen, sondern nur den für die
  703.     Addresse des Strings, so daß sie AllocString() aus StringLib oder etwas
  704.     ähnliches aufrufen müssen, um Raum zum arbeiten zu erhalten.
  705.     Wenn sie ein BASIC Programmierer sind, könnten sie Probleme bekommen
  706.     und sollten Literatur über C Strings zu rate ziehen.
  707.     Übrigens ist 'stringvar^' vom Type 'char' implememtiert. Die andere
  708.     Art, Zeichen eines Strings zu untersuchen, ist die Index Schreibweise.
  709.     'S[3]' gibt z.B. das 4. Zeichen im String 'S' zurück, da alle String
  710.     Indexe mit Null beginnen.
  711.  
  712.  
  713.  
  714.                     
  715. [4mCompiler Direktiven
  716. [0m
  717.  
  718.     Es wird vielleicht einmal Billionen an Compiler Direktiven geben,
  719.     zur Zeit gibt es aber nur Drei. Compiler Direktiven arbeiten
  720.     folgendermaßen:  Wenn das erste Zeichen in einem Kommentar ein Dollar
  721.     Zeichen ($) ist, überprüft der Compiler, ob das nächste Zeichen ein
  722.     Befehl ist. Es dürfen zwischen der Klammer, dem Dollar Zeichen und
  723.     dem Befehl keine Leerzeichen sein.
  724.     Die Compiler Direktiven.
  725.  
  726.     {$I "fname"}    Das fügt die Datei "fname" an dieser Stelle in den
  727.                     Programmtext ein. Wenn dies beendet ist, wird der
  728.                     Kommentar beendet (hier sind keine weiteren Direktiven
  729.                     erlaubt) und weitergemacht.
  730.                     Es kann eine beliebige Anzahl von Leertasten vor dem
  731.                     Dateinamen und alles was sie wollen dahinter stehen.
  732.                     Der Dateiname ist ein String, deshalb muß er in
  733.                     Anführungszeichen eingeschlossen werden. Mehrere der
  734.                     Beispielprogramme sollten die Include Syntax
  735.                     demonstrieren.
  736.                     Ab Version 1.0c haben Include Dateien zwei neue
  737.                     Möglichkeiten. Die erste ist, daß sie nun verschachtelt
  738.                     werden können, d.h. eine Include Datei kann in eine
  739.                     Andere eingebunden wreden. Die zweite Fähigkeit ist, daß
  740.                     PCQ nun eine Liste der Include Dateien führt, so daß eine
  741.                     Datei nicht zweimal eingebunden wird. Diese Liste enthält
  742.                     nur die Dateinamen, nicht Verzeichnisse oder Laufwerke.
  743.  
  744.     {$A             Hiermit kann man direkt Assembler Anweisungen in die
  745.      Anweisungen    Assembler Datei des Compilers schreiben. Sie müssen sich
  746.     }               die Assembler Ausgabe des Compilers ansehen, um zu
  747.                     erkenne, wie er Referencen auf Variablen und
  748.                     Unterprogramme behandelt. Diese Direktive übergibt
  749.                     einfach alles hinter dem A bis vor der schließenden
  750.                     Klammer an den Assembler. Sie sollten deshalb auch
  751.                     Kommentare nach den Assembler Konventionen benutzen.
  752.  
  753.     {$R+} oder      Die '+' Anweisung weist dem Compiler an,
  754.     {$R-}           Bereichsprüfungen für Arrays durchzuführen. Von hier,
  755.                     bis zu der Stelle, wo {$R-} steht, wird bei jeder Zugriff
  756.                     auf ein Array überprüft, ob der Index sich im erlaubtem
  757.                     Rahmen bewegt. Dies vergrößert und verlangsamt das
  758.                     Programm, deshalb empfiehlt Patrick, es nur in der
  759.                     Textphase zu benutzen. Wenn ein Index sich außerhalb
  760.                     seiner Grenzen befindet, wird das Programm mit einer
  761.                     Fehlermeldung abgebrochen (siehe "Laufzeitfehler" für
  762.                     weitere Informationen.
  763.  
  764.  
  765.  
  766.  
  767.                     
  768. [4mTypen Konvertierungn
  769. [0m
  770.  
  771.  
  772.     Wenn sie Modula-2 (oder Turbo Pascal ab 4.0, A.d.Ü) benutzt haben, können
  773.     sie diesen Abschnitt überspringen. Als Patrick den Compiler schrieb,
  774.     fand er es nötig, die Typenüberprüfung etwas zu umgehen und benutzte
  775.     Modula-2 Syntax, um dies zu erreichen. Wenn sie sie benutzen, wird der
  776.     Name eines Types wie eine Funktion eingesetzt. Der Ausdruck in Klammern
  777.     wird berechnet und das Ergebnis wird als von dem angegebenem Type
  778.     angesehen. Das sieht so aus:
  779.  
  780.         IntegerVariable := integer(irgendein Ordinaler Ausdruck);
  781.         CharVar := char (456-450);
  782.         if boolena('r') then ...
  783.  
  784.     Das funktioniert sowohl mit den Standardtypen, als auch mit den von
  785.     ihnen definierten. Folgendes wäre also auch legal:
  786.  
  787.         type
  788.           charprt = ^char;
  789.  
  790.         var
  791.           charvar : charprt;
  792.         ....
  793.           charvar := charprt(0);
  794.           charvar := charprt(integer(charvar) +1);
  795.  
  796.     Beachten sie, daß die Typen dafür benannt worden sein müssen.
  797.  
  798.         variable := array [1..4] of char(Ausdruck())
  799.  
  800.     würde also nicht arbeiten.
  801.  
  802.     Beachten sie auch, daß nicht alle Typen Konvertierungen funktionieren.
  803.     Einen Typen in einen einer anderen Größe konvertieren ist eine genauso
  804.     schlechte Idee, wie einen strukturierten Type (Array oder Record)
  805.     in einen einfachen umzuwandeln.
  806.  
  807.  
  808.  
  809.  
  810.                     
  811. [4mExterne Verweise
  812. [0m
  813.  
  814.     Zuerst ein bißchen Hintergrundwissen. Der Quellcode für den Compiler ist
  815.     über 79K groß. Das Assemberlistings dazu ist mehr als fünf mal größer,
  816.     so daß es wohl in einem Programm zu unübersichtlich geworden wäre. Was
  817.     Patrick brauchte, war ein Weg, es zu zerlegen und die Teile einzeln zu
  818.     compilieren. Wenn sie eine vorher compilierte Prozedur haben, die
  819.     sie aufrufen wollen, müssen sie diese nur vorher deklarieren.
  820.     Wenn der Compiler am Ende ihres Programmes die Prozedur nicht gefunden
  821.     hat, nimmt er an, daß es eine externe Reference ist und macht
  822.     entsprechende Angaben in der Assembler Datei. Das sieht so aus:
  823.  
  824.         procedure DrawMap;
  825.             forward;
  826.  
  827.     So lange, wie sie nicht anderes als DrawMap definieren, macht der
  828.     Compiler eine externe Reference _DrawMap in die Assembler Datei.
  829.  
  830.     Um die Benutzung von globalen Variablen in externen Routinen zu
  831.     ermöglichen, hat Patrick das Dateiformat geändert.
  832.     Das normale Dateiformat sieht so aus:
  833.  
  834.         program Name;
  835.  
  836.         Deklarationen
  837.  
  838.         Prozeduren und Funktionen
  839.  
  840.         begin
  841.           Hauptprogramm
  842.         end.
  843.  
  844.     Die externe Datei sieht so aus:
  845.  
  846.         external;
  847.  
  848.         Deklarationen (wie normal)
  849.  
  850.         Prozeduren und Funktionen (wie normal)
  851.  
  852.     Es gibt drei Dinge zu beachten. Erstens gibt es kein Hauptprogramm,
  853.     zweitens keine spezielle Syntax, die das Ende angibt. Als letzte wird
  854.     jede Variable, die global deklariert wird, als externe Refernce
  855.     betrachtet. Im Quelltext für den Compiler ist eine Datei, in der sich
  856.     nur die globalen Deklarationen für den Compiler befinden. Diese Datei
  857.     wird von allen 10 Quelltext eingebunden, aber nur das Hauptprogramm
  858.     erzeugt Speicherplatz für sie, die anderen 9 nur externe Verweise.
  859.  
  860.     Hier können gleich einige Dinge im Zusammenhang mit dem Assembler
  861.     besprochen weerden.
  862.     Alle Prozeduren, Funktionen und Variablen Namen werden als externe
  863.     Referenzen von dem Modul, in dem sie sind, angeboten. Wenn eine
  864.     Routinen daruaf zugreifen will, muß sie nach einem Namen, der mit
  865.     einem Unterstrich beginnt und ansonsten mit dem ursprünglichem Namen
  866.     identisch ist, suchen. Sie sollten auch geachten, daß keine Prüfung
  867.     über Dateien hinweg erfolgt (sie sollten Modula-2 benutzen, wenn sie
  868.     das benötigen). Das bedeutet, daß eine Prozedur, die einen String
  869.     erwartet, eine Boolean Variaable übergeben bekommt, was wahrscheinlich
  870.     einen Guru hervorrufen würde.
  871.     Des weiteren sollten sie beachten, daß der Compiler Argumente von
  872.     Prozeduren und Funktionen rechts nach links auf dem Stack speichert,
  873.     im Gegensatz zu den meisten C Compilern (darunter Lattice C und PDC),
  874.     die es andersherum machen. Daß bedeutet nicht, daß sie deren Code und
  875.     Libraries nicht benutzen können - es heißt nur, daß sie die Reihenfolge
  876.     der Argumente umdrehen müssen.
  877.     Noch zwei weitere Bemerkungen: der Compiler die erwarten, daß die
  878.     Register d0, d1, d2, a0 und a1 leer sind. D2 könnte ein Problem
  879.     sein, aber die Anderen sollten dies nicht. Für weitere Informationen
  880.     sollten sie den erzeugten Assembler Code betrachten.
  881.     Das Zweite ist, daß sie beachten sollten, ws 'var' vor einer Variable
  882.     macht und sollten sicher sein, daß sie dies korrekt benutzen, wenn
  883.     sie den Code mit dem anderer Sprachen mischen.
  884.  
  885.  
  886.  
  887.  
  888.                     
  889. [4mEingabe/Ausgabe
  890. [0m
  891.  
  892.     Es gibt verschiedene Routienen für die Behandlung von IO
  893.     (Input/Output = Eingabe/Ausgabe) unter PCQ. Vorher kommt allerdings die
  894.     Beschreibung, was passiert, wenn eine Datei geöffnet wird. Die aktuelle
  895.     Datei Variable, die sie im Programm deklarieren (ungefähr so:
  896.  
  897.         var
  898.           filevar : file of integer;
  899.  
  900.     ) ist eine Art Record, der ungefähr so aussähe:
  901.  
  902.     file = record
  903.       FileHandle : ein DOS Datei Handler
  904.       Buffer     : ein Zeiger auf den Eingabe Buffer
  905.       Size       : die Größe der Elemente in der Datei
  906.       EOF        : ein Boolean Wert
  907.       IN/OUT     : (Eingabe/Ausgabe)
  908.       NextFle    : ein Zeiger auf den nächsten File Record
  909.     end;
  910.  
  911.     Sie können diese Felder zwar zur Zeit nocht nicht ansprchen, trotzdem
  912.     werden 18 Bytes Speicher reserviert. Wenn sie eine Datei öffnen, werden
  913.     alle diese Felder bei Bedarf initialisiert und das erste Element wird in
  914.     den Buffer gelesen. Der Buffer wird mittels der filevar^ Syntax
  915.     angesprochen. Beachten sie auch, daß das Programm, wenn die Größe der
  916.     Elemente größer als 4 oder 3 ist, Speicher für den Buffer reserviert.
  917.     Darauf zeigt die Variable Buffer in dem Record. Wenn die Größe 1, 2 oder
  918.     4 ist (bei Char, Short oder Integer), benutzt das Programm statt dessen
  919.     die Variable Buffer als Buffer, so daß etwas Speicher und Zeit gespart
  920.     wird. Filevar^ spricht immer den Buffer an, egal wo er sich befindet.
  921.     Im Moment kann der Compiler nur Speicher für ein Dateielement
  922.     reservieren, wodurch die Eingabe/Ausgabe des Compilers wesentlich
  923.     langsamer wird. Das wird vielleicht eines Tages geändert, zur Zeit
  924.     können sie nur auf DOS Routinen zurückgreifen.
  925.     Wenn am Ende der Programm Ausführung noch Dateien offen sind, werden
  926.     sie vom Shut-Down Code geschlossen. Dies trifft aber nur auf Dateien,
  927.     die mit der Pascal Funktion open()geöffnet wurden zu. Alles was sie
  928.     direkt durch AmigaDOS öffnen fällt unter ihre eigene Verantwortung.
  929.  
  930.     Die Eingabe/Ausgabe Routinen sind:
  931.  
  932.     function open ( Dateiname : string;
  933.                     Dateivariable : file of irgendetwas oder Text) : boolean;
  934.  
  935.     (* Diese Funktioe öffnet eine Datei, um sie zu beschreiben. Wenn die
  936.        Datei schon existierte, wird sie gelöscht (wie von "rewrite" bei
  937.        Turbo Pascal, A.d.Ü.). Wenn alles korrekt war, wird TRUE
  938.        zurückgegeben, ansonsten FALSE.                                    *)
  939.  
  940.  
  941.     function reopen ( Dateiname : string;
  942.                       filevar   : file of irgendetwas oder Text) : boolean;
  943.  
  944.     (* Diese Funktion ist equivalent zu open(), mit der Ausnahme, daß sie
  945.        eine schon existierende Datei zum schreiben öffnet (wie "reset" bei
  946.        Turbo Pascal, A.d.Ü.).                                             *)
  947.  
  948.     Die übrigen Routinen sind die selben, wie bei den meisten Pascal
  949.     Dialekten und werden hier nur der Vollständigkeit halber aufgelistet:
  950.  
  951.     write()     Schreibt etwas in eine Datei oder in die Standard Ausgabe
  952.  
  953.     writeln()   Macht dasselbe wie write, erzeugt aber einen Zeilenvorschub.
  954.                 Dies ist nur für Textdateien (auch die Standardausgabe,
  955.                 A.d.Ü.) sinnvoll.
  956.  
  957.     read()      Ließt etwas von einer DAtei oder der Standard Eingabe.
  958.                 read (filevar, x) ist als
  959.                     x := filevar^;
  960.                     get(flevar);
  961.                 codiert, wie in den meisten Pascal Dialekten.
  962.  
  963.     readln()    Ließt Daten bis zu einem Zeilenvorschub (RETURN) ein, was
  964.                 ebenfalls nur bei Text Datein sinnvoll ist.
  965.  
  966.     get()       Ließt das nächste Dateielement aus der Datei in den Buffer.
  967.  
  968.  
  969.     Wenn der erste Parameter von "read(ln)" oder "write(ln)" eine Variable
  970.     ist, wird die Ein-/Ausgabe mit dieser Datei, statt mit der Tastatur
  971.     durchgeführt. Das ist normales Pascal und sieht so aus:
  972.  
  973.         writeln(outfile, 'Das Ergebnis ist: ', 56 DIV 4);
  974.  
  975.     Stellenformatierung wird auch wie normal unterstützt:
  976.  
  977.         writeln ((67 * 32) + 5:10);
  978.  
  979.     ... gibt das Ergebnis in einem rechts zentriertem Feld mit 10 Stellen
  980.     aus, wobei die Zeichen, die den Breich sprengen, links stehen.
  981.     Die Anzahl der Stellen kann maximal MaxShort betragen. Sie könne
  982.     Stelleformatierung für jeden Type, aber nur in Text Dateien anwenden.
  983.     Real Zahlen haben zwei Felder. Das Erste wird genauso wie das für die
  984.     Integerzahlen benutz, das Zweite ist nicht nötig und gibt die Anzahl
  985.     der Nachkommastellen, die ausgegeben werden sollen, an.
  986.     Wenn dies Null ist, werden keine Zahlen und kein Punkt ausgegeben.
  987.     Das Maximum hierfür sind 30 STellen, was aber sowie über dem Limit von
  988.     FFP liegt. Die Standardeinstellungen hierfür sind write((5.4 / 4.0):1:2).
  989.  
  990.     Der Vollständigkeit halben wird hier noch einmal angegeben, was bei
  991.     verschiedenen write Opterationen in eine Text Datei ausgegeben wird:
  992.  
  993.         Write Char
  994.             Schreibt ein Zeichen.
  995.  
  996.         Write Boolean
  997.             Schreibt TRUE oder FALSE, ohne extra Leerzeichen.
  998.  
  999.         Write Integer
  1000.             Schreibt die Zahl ohne extra Leerzeichen, aber mit Minus Zeichen.
  1001.  
  1002.         Write Real
  1003.             Schreibt den Integer Teil einer Zahl ganz normal und, wenn die
  1004.             Läänge des zweiten Feldes größer Null ist, einen Punkt, gefolgt
  1005.             von der Anzahl der Nachkommastellen.
  1006.  
  1007.         Write Array of Char
  1008.             Schreibt das ganze Array, vom erstem bis zum letztem Element.
  1009.  
  1010.         Write String
  1011.             Schreibt vom erstem Zeichen, bis vor dem Null Byte.
  1012.  
  1013.         Writeln
  1014.             Schreibt ein einfaches EOLN (Zeilenende, Chr(10)) Zeichen.
  1015.  
  1016.  
  1017.         Read Char
  1018.             Ließt ein Zeichen.
  1019.  
  1020.         Read Boolean
  1021.             Ist nicht möglich.
  1022.  
  1023.         Read Integer
  1024.             Überspring solange Leerzeichen und Tabulatoren, bis es auf etwas
  1025.             underes trifft, ließt Stellen, bis es auf etwas anderes trifft.
  1026.             Wenn die Routinen auf EOLN vor der ersten Stelle trifft, gibt
  1027.             sie Null zurück. Wenn sie Buchstaben vor Zahlen findet, gibt
  1028.             sie ebenfalls Null zurück.
  1029.  
  1030.         Read Real
  1031.             Ließt den Integer Teil einer Zahl ganz normal und den Zweiten,
  1032.             falls er vorhanden ist.
  1033.  
  1034.         Write Array of Char
  1035.             Ließt solange Array Felder ein, bis das Array voll ist, oder
  1036.             EOLN kommt. EOLN wird nicht eingelesen, daß müsen sie mit
  1037.             readln machen. Wenn das Array nicht voll ist, werden die
  1038.             anderen Felder mit Leerzeichen gefüllt.
  1039.  
  1040.         Read String
  1041.             Ließt Zeichen, bis es auf EOLN trifft. Das EOLN Zeichen ist
  1042.             links (?, A.d.Ü) im Eingabestrom und wird durch ein Null Byte
  1043.             ersetzt. Beachten sie, daß diese Routine nicht die Länge des
  1044.             Stringes überprüft, sie müssen sicher sein, daß der String
  1045.             auch die längste Zeile, auf die er trifft, verarbeiten kann.
  1046.  
  1047.         Writeln
  1048.             Ließt Zeichen bis zu und einschließlich dem nächstem EOLN.
  1049.  
  1050.     Denken sie auch an die Funktion eof(filevar) und beachten sie, daß
  1051.     es keine put() Funktion analog zu get() gibt. Betrachten sie die
  1052.     beigefügten Programme für weitere Informatonen. Beachten sie auch,
  1053.     daß die filevar^ Syntax vorhanden ist. Schauen sie in einen Pascal
  1054.     Text, um dies zu verstehen (Patrick und ich sind beide der Meinung,
  1055.     daß turbo Pascal dies nicht benutzt, so daß es Spanisch für die
  1056.     meisten Pascal Programmier sein wird).
  1057.  
  1058.  
  1059.  
  1060.  
  1061.                         
  1062. [4mFehler
  1063. [0m
  1064.  
  1065.     Wie oben schon geschrieben, wird der arme Compiler von den meisten
  1066.     Fehlern völlig verwirrt und fängt an, Fehler auszugeben, die gar nicht
  1067.     existieren. Eine Reihe von Fehler kann er beheben, z.B. erfolgt bei
  1068.     Auslassung eines Semikolons trotzdem eine Compilation, mit einer
  1069.     entsprechenden Fehlermeldung. Sehr wenige andere Fehler werden so gut
  1070.     verarbeitet. Patrick hofft, den Compiler rin wenug benutzerfreundlicher
  1071.     zu machen, bis dahin aber wird die Compilation bei 5 Fehlern abgebrochen,
  1072.     da es sonst passieren könnte, daß der Compiler einen Fehler entdeckt,
  1073.     daraus weitere Fehler produziert und schließlich an einer Stelle hängen
  1074.     bleiben würde.
  1075.  
  1076.     Wenn ein Fehler auftritt, schreibt der Compiler meistens die zwei
  1077.     Zeilen, die dazu geführt haben und hebt den Teil, an dem er zur Zeit
  1078.     arbeitet, hervor. Der Fehler trat entweder an der hervorgehobenen Stelle
  1079.     oder direkt davor auf.
  1080.     In der nächsten Zeile steht die Zeilennummer des Fehlers und dessen
  1081.     Erklärung. Im Moment gibt es nur Textbeschreibungen der Fehler, keine
  1082.     Fehlernummern.
  1083.  
  1084.  
  1085.  
  1086.  
  1087.                         
  1088. [4mLaufzeitfehler
  1089. [0m
  1090.  
  1091.     Viele Dinge verursachen Laufzeitfehler, aber zur Zeit werden nur einige
  1092.     unterstützt:
  1093.  
  1094.         Fehler  Erklärung
  1095.  
  1096.           50    Kein Speicher für new()
  1097.           52    Array Index außerhalb des erlaubten Bereiches
  1098.  
  1099.     Die Fehlernummer wird zurückgegeben mittels der exit() Funktion an
  1100.     AmigaDOS zurückgegeben. Wenn das Programm in einer Batchdatei läuft,
  1101.     erhalten sie den Rückgabewert. Patrick hofft, das Laufzeitsystem in
  1102.     der nächsten Version zu verbessern.
  1103.  
  1104.  
  1105.  
  1106.  
  1107.                         
  1108. [4mQuelltexte
  1109. [0m
  1110.  
  1111.     Patrick schrieb den Compiler aufgrund des Lerneffektes. Hier einige
  1112.     Stellen, von denen er Informationen bekam:
  1113.  
  1114.     1. PDC, ein frei vertreibbaren C Compiler von Jeff Lydiatt. Das ist
  1115.        ein sehr gutes Programm und einer der besten Public Domain Compiler
  1116.        für den Amiga (der andere sehr gute ist Draco von Chris Gray).
  1117.        Patrick hat aus den von PDC erzeugten Listings. Der Blick auf den
  1118.        Assembler Code dieses Compilers war auch Patricks Inspiration, mit
  1119.        dem Schreiben eines Compilers zu starten.
  1120.  
  1121.     2. Pascal-S, der Pascal Compiler von ETH Zürich, von dem er einige, aber
  1122.        nicht viele Gedanken über die Struktur übernahm.
  1123.  
  1124.     3. Small-C, ein weiterer frei vertreibbarer C Compiler. Dieses ist nicht
  1125.        annähernd so gut wie PDC, aber seine Einfachheit half Patrick, einige
  1126.        Dinge zu verstehen. Dieser Compiler und PDC waren die, die Patrick
  1127.        benutze, bevor PCQ sich selbst compilieren konnte. Viele Aspekte
  1128.        in der Aufmachung des Compilers stammme von Small-C.
  1129.  
  1130.     4. Brinch Hansen on Pascal Compilers, von Per Brinch Hasen.
  1131.        Dieses Buch war nützlicher, als das andere halbe Dutzend, das Patrick
  1132.        gelesen hat, während er diesen Compiler schrieb. Er hat daraus vieles
  1133.        über die Dinge, die er falsch machte, gelernt. Großartig.
  1134.  
  1135.     5. Sozobon-C. Das ist ein Freeware C Compiler für den Atari ST, der
  1136.        teilweise auf den Amiga übertragen wurde. Patrick hat daraus seine
  1137.        32 Bit mathematischen Routinen entnommen und überlegt, ob er daraus
  1138.        noch etwas für Fließkommarechnung übernimmt.
  1139.  
  1140.     6. Die Toy Compiler Serie in Amiga Transactor von Chris Gray. Patrick
  1141.        hatte, als er dies schrieb, nur den ersten Teil gelesen, aber Chris,
  1142.        der Autor von Draco, dessen Hobby es ist, Compiler zu schreiben, hat
  1143.        viele interessante Dinge in seinem kleinem Compiler gehabt.
  1144.  
  1145.     Wenn sie Public Domain Compiler mögen, sollten sie sich Draco von
  1146.     Chris Gray (auf Fish 201) und PDC von Jeff Lydiatt (auf Fish 110)
  1147.     betrachten. Beide sind bessere Produkte als PCQ (sagt Patrick) und
  1148.     können sogar mit komerziellen Produkten mithalten. Patrick weiß nicht,
  1149.     wo sich die neueste Version von PDC befindet, aber sie können ja an
  1150.     Jeff schreiben, es ist es wert. PDC hat einen vollen Preprozessor,
  1151.     ein 'cc' Frontend, sehr schnellen optimierten Code ... und arbeitet).
  1152.     Die Syntax von Draco ist übrigens der von Pascal sehr ähnlich.
  1153.  
  1154.  
  1155.  
  1156.  
  1157.                 
  1158. [4mBemerkungen für Assembler Programmierer
  1159. [0m
  1160.  
  1161.     Während dem Programmablauf, benutzt PCQ die Register d0, d1, a0 und
  1162.     a1. Es benutzt auch d2 und d3 für IO Aufrufe und d2, wenn es große
  1163.     Datenstrukturen vergleicht oder überträgt. D2, D3 und A2 werden alle
  1164.     von 32 Bit Routinen entfernt. A7 ist wie immer der Stack Zeiger und
  1165.     a5 wird als Rahmenzeiger benutzt. A6 enthält die Library Addressen,
  1166.     während eines Systemaufrufes und A4 ist für die Benutzung in der
  1167.     Zukunft reserviert (um lokale Variablen einer übergeordneten Prozedur
  1168.     anzusprechen). Die anderen Register sind frei und können von ihnen
  1169.     benutzt werden. Der Compiler führt keine Codeoptimierung durch.
  1170.  
  1171.  
  1172.  
  1173.  
  1174.                     
  1175. [4mGeplante Erweiterungen
  1176. [0m
  1177.  
  1178.     Version 1.1 des Compiler wird definitiev Folgendes enthalten:
  1179.  
  1180.     Volle 32 Bit Mathematik ( Wurde in Version 1.0a ergänzt)
  1181.  
  1182.     Voll integerierte Fließkommarechnung ( Wurde in Version 1.0c ergänzt)
  1183.  
  1184.     Implementierung von verschachtelten Prozeduren
  1185.  
  1186.     Keine weiteren festen Arrays im Compiler selber (Vielleicht nicht...)
  1187.  
  1188.     Die Möglichkeit, mit der Workbench zu arbeiten ( In Version 1.0a ergänzt).
  1189.  
  1190.     Ansonsten ist es Patricks Hauptziel, Fehler zu beheben. Ziemlich weit
  1191.     unten in der Liste steht, jedes Detail von Pascal zu implemetieren.
  1192.     So weit es geht, möchte Patrick den Compiler über den ARexx Port in
  1193.     CygnusED Professional einbinden.
  1194.     Version 1.1 wird wahrscheinlihc im Sommer 89 veröffentlich werden.
  1195.     Als Patrick dies im July schrieb, war er sich dessen nicht mehr so
  1196.     sicher, da er wesentlich mehr zu tun hatte, als im Frühling erwartet
  1197.     (er hat diese Version (1.0c) im Sommer 89 veröffentlicht, A.d.Ü.).
  1198.  
  1199.  
  1200.  
  1201.  
  1202.                     
  1203. [4mUpdate History
  1204. [0m
  1205.  
  1206.     Version 1.0c, 21 Mai 1989:
  1207.  
  1208.     Patrick hat die Eingabe Routinen etwas geändert, indem er DOS Dateien
  1209.     anstelle von PCQ Dateien benutzt. Er hat die Eingabe gepuffert und die
  1210.     Strukture flexibler gemacht, so daß Eingaben verschachtelt wrden können.
  1211.     Anstatt einige IfNDef Direktdiven zu implememtieren, hat Patrick eine
  1212.     Beobachtung der eingebundenen Dateien geschrieben, so daß keine doppelt
  1213.     eingefügt wird. Die Pufferung der Eingabe hat die Compilierungszeit
  1214.     halbiert. Patrick hatte nicht geglaubt, daß das so signifikant ist
  1215.     und überlegt, die Ein-/Ausgabe Routinen unter diesem Aspeckt
  1216.     zu überdenken.
  1217.     Er hat eine Überprüfug auf CTRL-C eingefügt, so daß man früh und sauber
  1218.     abbrechen kann. Die Port.i Include Datei hatte eine Reihe von Fehlern,
  1219.     die behoben wurden und die Routinen, die ein Consolen Fenster für
  1220.     Programme öffnen, die eines benötigen, wurden ebenfalls korrigiert.
  1221.     Vorher gab es Probleme, wenn write() mehere Parameter hatte.
  1222.     Die SizeOf() Funktion, FLießkommarechnung und die dazugehörigen
  1223.     Funktionen wurden von Patrick programmiert.
  1224.     Es gab verschiedene kleinere Probleme mit den Include Dateien, die
  1225.     Patrick behob, als er die 1.3 Dateien bekam, das erste offizielle
  1226.     Set, daß er seit Version 1.0 hatte.
  1227.     Er lockerte die Syntax von AND, OR und NOT, so daß nun Ordinale Typen
  1228.     erlaubt sind, so daß man nun auch bitweise Operationen mit diesen
  1229.     Typen durchführen kann. Des weiteren wurde die Funktion Bit()
  1230.     hinzugefügt.
  1231.     Schließlich wurden Indexe für Strings eingeführt. Während Patrick dies
  1232.     machte, fand er einen Fehler in der Addressierungsroutinen selector(),
  1233.     weshalb er diese neu schrieb. Patrick meint zwar, daß jetzt größerer
  1234.     Code erzeugt wird, aber er will bald Expression Trees (was immer das
  1235.     sein mag) einführen.
  1236.  
  1237.     Version 1.0b, 17. April 1989:
  1238.  
  1239.     Patrick hat einen Fehler im Vergleich von komplexen Strukturen behoben.
  1240.     Es scheint, daß vorher zu viele Bytes erwartet wurden, so daß der
  1241.     Vergleich oft mißlang.
  1242.  
  1243.     Version 1.0a, 8. April 1989:
  1244.  
  1245.     In dieser Version wurde 32 Bit Mathematik ergänzt und Fehler in Case
  1246.     behoben. Für den Mathematik Teil hat Patrick nur den richtigen Assmbler
  1247.     Quelltext benötigt, aber Case hat er komplett geändert.
  1248.     Version 1.0 erzeugt eine Tabelle, in der sequentiell nach dem angegebenem
  1249.     Wert gesucht wurde. Patrick dachte, daß alle Compiler dies so machen,
  1250.     aber als er ein Turbo Pascal programm debuggte, bemerkte er, daß es
  1251.     einfach eine Reihe von Vergleichen vor jedem Statement waren.
  1252.     Patrick meint zwar, das das sehr simpel ist, hat es aber übernommen,
  1253.     da das, was für Turbo Pascal gut ist, auch für PCQ reicht.
  1254.     Das nächste, was geändert wurde, ist der Startup Code. Sie können nun
  1255.     PCQ Programme von der Workbench starten. Das war einerseits eine Frage
  1256.     der Workbench Message, andererseit von Ein-/Ausgabe. Wenn sie versuchen,
  1257.     in einem über die Workbench gestartetem Programm etwas über die Standard
  1258.     Ein-/Ausgabe zu lesen/schreiben, öffnet der Laufzeitcode ein Fenster
  1259.     für sie.
  1260.     Des weiteren wurde ein Fehler behoben: Ein Array Index, das bisher nicht
  1261.     von einem numerischer Typen war, erzeugte Chaos. Jetzt nicht mehr!
  1262.  
  1263.     Version 1.0, 1. Februar 1989
  1264.  
  1265.       Die Original Veröffentlichung
  1266.  
  1267.  
  1268.  
  1269.  
  1270.             
  1271. [4mWeitere Bemerkungen, Copyright & Patricks Addresse
  1272. [0m
  1273.  
  1274.     Wie oben angegeben sind der Quelltext für den Compiler, der Compiler
  1275.     selber, der Quelltext für die Runtime Library und die Runtime Library
  1276.     selber alle (ähem):
  1277.  
  1278.         Copyright (c) 1989 Patrick Quaid.
  1279.  
  1280.     Das Packet darf frei vertrieben werdem, solange sich alle Dateien
  1281.     dieses Archives mit Ausnahme des Assemblers und des Linkers
  1282.     (legen sie sie aber wenn möglich trotzdem bei) unverändert darin
  1283.     befinden. Niemand darf mit dem Vertrieb Geld verdienen, d.h. es
  1284.     darf nur auf Diskette vertrieben werden, bei denen eine vernünftige
  1285.     Gebühr für die Diskette selber erhoben wird. Eine vernünftige Gebühr
  1286.     sieht Patrick als $10 pro Diskette an.
  1287.     Sie können mit dem Quelltext frei herumexerimentieren. Wenn sie
  1288.     entscheidene Veränderungen machen, würde Patrick sich freuen, wenn sie
  1289.     sie ihm zustellen, so daß er sie in der nächsten Version einfügen
  1290.     kann. Wenn sie Verbesserungen machen, die nicht mit den Standard Pascal
  1291.     Richtlinien übereinstimmen, sollen sie ihr Programm nicht unter dem
  1292.     Namen PCQ verteiben, da daß nur zu Chaos führt.
  1293.     Das ist kein Shareware Packet. Die einzige Bezahlung, die Patrick
  1294.     verlangt, ist eine Mittelung über entdeckte Fehler (nicht über
  1295.     nicht implementierte Fähigkeiten - die kennt Patrick selber).
  1296.     Wenn sie unbedingt ihr Geld loswerden wollen, können sie eine
  1297.     Gebühr an Charlie Gibbs, der den Assembler schrieb, und an
  1298.     The Software Distillery, die den Linker schrieb, schicken.
  1299.  
  1300.     Alle Fragen, Kommentare oder was auch immer, könne an folgende
  1301.     Addresse geschickt werden:
  1302.  
  1303.         Pat Quaid
  1304.         8320 E.Redwing
  1305.         Scottsdale, AZ 85253
  1306.  
  1307.         (602) 948-8325
  1308.  
  1309.         Viel Spaß mit dem Compiler. Wenn sie sich über ihn ärgern, bedenken
  1310.         sie, was sie für ihn bezahlt haben!
  1311.